package com.aiwiown.snackmq.common.exception;

import lombok.Getter;

/**
 * ErrorCode 枚举类定义了系统中使用的错误码及其描述信息。
 * 每个错误码由一个唯一的整数值和对应的描述字符串组成。
 * 该枚举类通过 Lombok 的 @Getter 注解自动生成 code 和 description 的 getter 方法。
 */
@Getter
public enum ErrorCode {
    // General Errors
    /**
     * 未知错误，通常用于未明确分类的异常情况。
     */
    UNKNOWN_ERROR(1000, "Unknown error"),

    /**
     * 表示请求无效，通常由于客户端传递了不合法的参数或格式。
     */
    INVALID_REQUEST(1001, "Invalid request"),

    /**
     * 表示压缩或解压缩过程中发生的错误。
     */
    COMPRESSION_ERROR(1002, "Compression or decompression error"),

    /**
     * 表示序列化或反序列化过程中发生的错误。
     */
    SERIALIZATION_ERROR(1003, "Serialization or deserialization error"),

    // Storage-related Errors
    /**
     * 表示存储服务相关的错误，可能涉及文件系统或数据库操作。
     */
    STORAGE_ERROR(2000, "Storage service error"),

    /**
     * 表示消息未找到，通常用于消息队列或缓存系统中。
     */
    MESSAGE_NOT_FOUND(2001, "Message not found"),

    // Connection-related Errors
    /**
     * 表示连接失败，通常由于网络问题或目标服务不可用。
     */
    CONNECTION_FAILED(3000, "Connection failed"),

    /**
     * 表示请求超时，通常由于响应时间超过了允许的最大值。
     */
    REQUEST_TIMEOUT(3001, "Request timed out"),

    // Leader and Replication Errors
    /**
     * 表示当前节点不是领导者节点，通常用于分布式系统中。
     */
    NOT_LEADER(4000, "Not the leader node"),

    /**
     * 表示数据复制失败，通常用于分布式系统的数据同步场景。
     */
    REPLICATION_FAILED(4001, "Replication failed");

    private final int code;
    private final String description;

    /**
     * 构造函数用于初始化 ErrorCode 枚举实例。
     *
     * @param code        错误码的唯一整数值，用于标识具体的错误类型。
     * @param description 错误的描述信息，提供关于错误的详细说明。
     */
    ErrorCode(int code, String description) {
        this.code = code;
        this.description = description;
    }
}
